package de.ssmp.wbs;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import de.ssmp.wbs.daten.Spieler;
import de.ssmp.wbs.daten.Torschuss;

/**
 * Diese Klasse ist eine Hilfsklasse zum einlesen von CSV Dateien. Aus diesen
 * werden die Torschussdaten für einen Spieler eingelesen und in eine
 * HashMap<String, String> gefüllt.
 * 
 * Weiterhin dient die Klasse als Ort von Konstantendefintionen.
 * 
 * @author stiewen
 * @author maximilian
 * @version 1 final
 */
public class Utilities {

	/* Variablen */
	static int i = 0;

	/**
	 * Alle Werte werden ausgeschlossen
	 */
	public static final String UNDERSCORE = "_";

	/**
	 * Alle Werte werden zugelassen
	 */
	public static final String STAR = "*";

	/**
	 * Ziel-Attribut Schlüssel
	 */
	public static final String ATTRIBUT_ZIEL = "Ziel";

	/**
	 * Dies ist eine Liste der Schluessel, die alle existierenden
	 * Torschuss-Attribute-Schlüssel enthält.
	 */
	public static ArrayList<String> keys;

	/* static init block */
	static {
		keys = new ArrayList<String>();
		keys.add("Anlauflaenge");
		keys.add("Richtung");
		keys.add("Verzoegerung");
		keys.add("Wurde gefoult");
		keys.add("Ort");
		keys.add("Kurve");
		keys.add("Wichtig");
		keys.add("Ziel");
	}

	/* Methods */
	/**
	 * Dies ist eine Wrapper-Funktion fuer das Einlesen der einzelnen
	 * Spielerdaten. Pro uebergebene Datei wird eine Methode zum einlesen dieser
	 * aufgerufen.
	 * 
	 * @param inputFile
	 *            Beliebig viele CSV-Dateien, als String (normale Pfadangabe +
	 *            Datei).
	 * @return Eine Spielerliste die ueber Torschussdaten und einem Namen (den
	 *         Dateinamen) verfuegen.
	 */
	public static final ArrayList<Spieler> readPlayerData(String... inputFile) {
		// erzeuge für jede CSV-Datei einen neuen Spieler und lese die Datei ein
		ArrayList<Spieler> spielerListe = new ArrayList<Spieler>();
		for (String s : inputFile) {
//			System.out.println(s);
			Spieler spieler = readData(s);
			spielerListe.add(spieler);
		}
		return spielerListe;
	}

	/**
	 * Ließt eine einzelne CSV Datei ein und füllt die einzelnen Spalten in eine
	 * ArrayList<Attribut> welche einem Torschuss uebergeben wird. Dieser
	 * Torschuss wird dann dem Spieler hinzugefuegt. Nachdem alle Torschuesse
	 * eines Spielers eingelesen wurden, wird das Spieler Objekt zurueckgegeben.
	 * 
	 * @param inputFile
	 *            Eine CSV-Datei.
	 * @return Ein einzelner Spieler mit allen Torschussdaten.
	 */
	private static final Spieler readData(String inputFile) {
		// Erzeugen eines neuen Spielers und einer Torschuss-Referenz
		Spieler spieler = new Spieler(inputFile);
		HashMap<String, String> torschuss = null;

		// Layout-Eigenschaften der CSV Datei
		int dataSetStartsAtLine = 1;
		int lineIndex = 0;
		String separator = ";";

		// Einlesen der Datei
		try {
			// Hilfsvariablen
			String zeile;
			String[] split = null;

			// Oeffnen der Datei
			FileReader file = new FileReader(inputFile);
			BufferedReader data = new BufferedReader(file);

			// Zeile fuer Zeile einlesen
			while ((zeile = data.readLine()) != null) {
				// Wenn die Datensaetze noch nicht beginnen, Zeile ueberspringen
				if (lineIndex < dataSetStartsAtLine) {
					lineIndex++;
					continue;
				}

				// Erzeuge neuen Torschuss
				torschuss = new HashMap<String, String>();

				// Teile die Zeile auf in einzelne Abschnitte
				split = zeile.split(separator);

				// Fuege alle Abschnitte der Attributliste hinzu
				for (int i = 0; i < split.length; i++) {
					if (!(split[i].equals(""))) {
						torschuss.put(keys.get(i), split[i].trim());
					}

				}

				// Fuege die TorschussAttribute einem Torschuss hinzu und fuege
				// diesen dem Spieler hinzu
				spieler.neuerTorschuss(new Torschuss(torschuss));
			}

		} catch (FileNotFoundException e) {
			System.out.println("Datei nicht gefunden");
		} catch (IOException e) {
			System.out.println("I/O-Fehler");
		}

		return spieler;
	}
}